package ${nameInfo.basicDaoPackage};

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

@SuppressWarnings({ "unchecked", "rawtypes" })
public abstract class ${nameInfo.basicDaoName} {
	private boolean cacheable = false;
	
	@Autowired
	private SessionFactory sessionFactory;
	
	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	
	public ${nameInfo.basicDaoName}() {
	}

	/**
	 * 是否开启查询缓存
	 * 
	 * @return 是否开启查询缓存
	 */
	public boolean isCacheable() {
		return cacheable;
	}

	/**
	 * 设置是否开启查询缓存
	 * 
	 * @param cacheable
	 */
	public void setCacheable(boolean cacheable) {
		this.cacheable = cacheable;
	}
	
	/**
	 * 获取Hibernate Session
	 * 
	 * @return Hibernate Session
	 */
	public Session getHibernateSession() {
		return sessionFactory.getCurrentSession();
	}
	
	// ====================================标准方法======================================================
	
	/**
	 * 保存实体类
	 * 
	 * @param <T>
	 * @param t
	 *            要保存的实体
	 * @throws Exception
	 */
	protected <T extends Serializable> void saveEntity(T t) throws Exception {
		getHibernateSession().persist(t);
	}

	/**
	 * 查询全部实体
	 * 
	 * @param <T>
	 * @param c
	 *            要查询的实体类型
	 * @return 全部的实体
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryAllEntity(Class<T> c)
			throws Exception {
		List<T> list = getHibernateSession().createCriteria(c).setCacheable(
				cacheable).list();
		return list;
	}

	/**
	 * 按照主键查询实体类
	 * 
	 * @param <T>
	 * @param key
	 *            主键数据
	 * @param c
	 *            要查询的实体类型
	 * @return 主键对应的实体类
	 * @throws Exception
	 */
	protected <T extends Serializable> T queryEntityByKey(Serializable key,
			Class<T> c) throws Exception {
		T r = (T) getHibernateSession().get(c, key);
		return r;
	}

	/**
	 * 更新实体数据
	 * 
	 * @param <T>
	 * @param t
	 *            要更新的实体类
	 * @throws Exception
	 */
	protected <T extends Serializable> void updateEntity(T t) throws Exception {
		getHibernateSession().merge(t);
	}

	/**
	 * 删除实体数据
	 * 
	 * @param <T>
	 * @param t
	 *            要删除的实体类
	 * @throws Exception
	 */
	protected <T extends Serializable> void deleteEntity(T t) throws Exception {
		getHibernateSession().delete(t);
	}

	/**
	 * 查询实体的数量
	 * 
	 * @param <T>
	 * @param c
	 *            实体的类型
	 * @return 实体的数量
	 * @throws Exception
	 */
	protected <T extends Serializable> int queryEntityCount(Class<T> c)
			throws Exception {
		Criteria criteria = getHibernateSession().createCriteria(c).setCacheable(
				cacheable).setProjection(Projections.rowCount());
		Number count = (Number) criteria.uniqueResult();
		return count.intValue();
	}

	/**
	 * 分页查询实体数据
	 * 
	 * @param <T>
	 * @param c
	 *            实体的类型
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @return 分页数据
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryEntityByPage(Class<T> c,
			int start, int limit) throws Exception {
		Criteria criteria = getHibernateSession().createCriteria(c).setCacheable(
				cacheable);
		criteria.setFirstResult(start);
		criteria.setMaxResults(limit);
		List<T> list = (List<T>) criteria.list();
		return list;
	}

	// ====================================标准方法======================================================

	// ====================================hql方法======================================================

	/**
	 * 执行更新语句的HQL并返回数量值
	 * 
	 * @param hql
	 *            更新语句的HQL
	 * @param params
	 *            HQL语句参数列表
	 * @return 更新语句的影响行数
	 * @throws Exception
	 */
	protected int executeHql(String hql, Object... params) throws Exception {
		Query query = getHibernateSession().createQuery(hql)
				.setCacheable(cacheable);
		processParams(query, params);
		int result = query.executeUpdate();
		return result;
	}

	/**
	 * 执行查询单一实体的HQL语句并返回结果
	 * 
	 * @param <T>
	 * @param hql
	 *            查询单一实体的HQL语句
	 * @param c
	 *            实体类型
	 * @param params
	 *            HQL语句参数列表
	 * @return 查询的实体类
	 * @throws Exception
	 */
	protected <T extends Serializable> T queryHqlEntity(String hql, Class<T> c,
			Object... params) throws Exception {
		Query query = getHibernateSession().createQuery(hql)
				.setCacheable(cacheable);
		processParams(query, params);
		return (T) query.uniqueResult();
	}

	/**
	 * 执行查询实体集合的HQL语句并返回结果
	 * 
	 * @param <T>
	 * @param hql
	 *            查询实体集合的HQL语句
	 * @param c
	 *            实体类型
	 * @param params
	 *            HQL语句参数列表
	 * @return 查询的集合
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryHqlEntityList(String hql,
			Class<T> c, Object... params) throws Exception {
		Query query = getHibernateSession().createQuery(hql)
				.setCacheable(cacheable);
		processParams(query, params);
		return (List<T>) query.list();
	}

	/**
	 * 执行查询数量的的HQL并返回数量值
	 * 
	 * @param hql
	 *            查询数量的HQL语句
	 * @param params
	 *            HQL语句参数列表
	 * @return 数量值
	 * @throws Exception
	 */
	protected int queryHqlCount(String hql, Object... params) throws Exception {
		Query query = getHibernateSession().createQuery(hql)
				.setCacheable(cacheable);
		processParams(query, params);
		Number count = (Number) query.uniqueResult();
		return count.intValue();
	}

	/**
	 * 执行HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的HQL语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            HQL语句参数列表
	 * @return HQL查询的分页数据
	 * @throws Exception
	 */
	protected List queryHqlListByPage(String hql, int start, int limit,
			Object... params) throws Exception {
		Query query = getHibernateSession().createQuery(hql)
				.setCacheable(cacheable);
		processParams(query, params);
		query.setFirstResult(start);
		query.setMaxResults(limit);
		return query.list();
	}

	/**
	 * 执行HQL查询的分页数据
	 * 
	 * @param <T>
	 * @param hql
	 *            查询实体集合的HQL语句
	 * @param c
	 *            实体类型
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            HQL语句参数列表
	 * @return HQL查询的分页数据
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryHqlEntityListByPage(
			Class<T> c, String hql, int start, int limit, Object... params)
			throws Exception {
		return queryHqlListByPage(hql, start, limit, params);
	}

	/**
	 * 执行HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的HQL语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            HQL语句参数列表
	 * @return HQL查询的分页数据
	 * @throws Exception
	 */
	protected List<Map<String, Object>> queryHqlMapListByPage(String hql,
			int start, int limit, Object... params) throws Exception {
		return queryHqlListByPage(hql, start, limit, params);
	}

	/**
	 * 执行HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的HQL语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            HQL语句参数列表
	 * @return HQL查询的分页数据
	 * @throws Exception
	 */
	protected List<Object[]> queryHqlObjectListByPage(String hql, int start,
			int limit, Object... params) throws Exception {
		return queryHqlListByPage(hql, start, limit, params);
	}

	// ====================================hql方法======================================================

	// ====================================NamedHql方法======================================================

	/**
	 * 执行更新语句的Named HQL并返回数量值
	 * 
	 * @param hql
	 *            更新语句的Named HQL
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 更新语句的影响行数
	 * @throws Exception
	 */
	protected int executeNamedHql(String hql, Object... params)
			throws Exception {
		return executeHql(
				getHibernateSession().getNamedQuery(hql).getQueryString(), params);
	}

	/**
	 * 执行查询单一实体的Named HQL语句并返回结果
	 * 
	 * @param <T>
	 * @param hql
	 *            查询单一实体的Named HQL语句
	 * @param c
	 *            实体类型
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 查询的实体类
	 * @throws Exception
	 */
	protected <T extends Serializable> T queryNamedHqlEntity(String hql,
			Class<T> c, Object... params) throws Exception {
		return queryHqlEntity(getHibernateSession().getNamedQuery(hql)
				.getQueryString(), c, params);
	}

	/**
	 * 执行查询实体集合的Named HQL语句并返回结果
	 * 
	 * @param <T>
	 * @param hql
	 *            查询实体集合的Named HQL语句
	 * @param c
	 *            实体类型
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 查询的集合
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryNamedHqlEntityList(
			String hql, Class<T> c, Object... params) throws Exception {
		return queryHqlEntityList(getHibernateSession().getNamedQuery(hql)
				.getQueryString(), c, params);
	}

	/**
	 * 执行查询数量的的Named HQL并返回数量值
	 * 
	 * @param hql
	 *            查询数量的Named HQL语句
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 数量值
	 * @throws Exception
	 */
	protected int queryNamedHqlCount(String hql, Object... params)
			throws Exception {
		return queryHqlCount(getHibernateSession().getNamedQuery(hql)
				.getQueryString(), params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的Named HQL语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected List queryNamedHqlListByPage(String hql, int start, int limit,
			Object... params) throws Exception {
		return queryHqlListByPage(getHibernateSession().getNamedQuery(hql)
				.getQueryString(), start, limit, params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param <T>
	 * @param hql
	 *            查询实体集合的Named HQL语句
	 * @param c
	 *            实体类型
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryNamedHqlEntityListByPage(
			Class<T> c, String hql, int start, int limit, Object... params)
			throws Exception {
		return queryHqlEntityListByPage(c, getHibernateSession().getNamedQuery(hql)
				.getQueryString(), start, limit, params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的Named HQL语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected List<Map<String, Object>> queryNamedHqlMapListByPage(String hql,
			int start, int limit, Object... params) throws Exception {
		return queryHqlMapListByPage(getHibernateSession().getNamedQuery(hql)
				.getQueryString(), start, limit, params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的Named HQL语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected List<Object[]> queryNamedHqlObjectListByPage(String hql,
			int start, int limit, Object... params) throws Exception {
		return queryHqlObjectListByPage(getHibernateSession().getNamedQuery(hql)
				.getQueryString(), start, limit, params);
	}

	/**
	 * 执行更新语句的Named HQL并返回数量值
	 * 
	 * @param hql
	 *            更新语句的Named HQL
	 * @param extendHql
	 *            扩展的hql语句
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 更新语句的影响行数
	 * @throws Exception
	 */
	protected int executeNamedHql(String hql, String extendHql,
			Object... params) throws Exception {
		return executeHql(getHibernateSession().getNamedQuery(hql).getQueryString()
				+ extendHql, params);
	}

	/**
	 * 执行查询单一实体的Named HQL语句并返回结果
	 * 
	 * @param <T>
	 * @param hql
	 *            查询单一实体的Named HQL语句
	 * @param extendHql
	 *            扩展的hql语句
	 * @param c
	 *            实体类型
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 查询的实体类
	 * @throws Exception
	 */
	protected <T extends Serializable> T queryNamedHqlEntity(String hql,
			String extendHql, Class<T> c, Object... params) throws Exception {
		return queryHqlEntity(getHibernateSession().getNamedQuery(hql)
				.getQueryString()
				+ extendHql, c, params);
	}

	/**
	 * 执行查询实体集合的Named HQL语句并返回结果
	 * 
	 * @param <T>
	 * @param hql
	 *            查询实体集合的Named HQL语句
	 * @param extendHql
	 *            扩展的hql语句
	 * @param c
	 *            实体类型
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 查询的集合
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryNamedHqlEntityList(
			String hql, String extendHql, Class<T> c, Object... params)
			throws Exception {
		return queryHqlEntityList(getHibernateSession().getNamedQuery(hql)
				.getQueryString()
				+ extendHql, c, params);
	}

	/**
	 * 执行查询数量的的Named HQL并返回数量值
	 * 
	 * @param hql
	 *            查询数量的Named HQL语句
	 * @param extendHql
	 *            扩展的hql语句
	 * @param params
	 *            Named HQL语句参数列表
	 * @return 数量值
	 * @throws Exception
	 */
	protected int queryNamedHqlCount(String hql, String extendHql,
			Object... params) throws Exception {
		return queryHqlCount(getHibernateSession().getNamedQuery(hql)
				.getQueryString()
				+ extendHql, params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的Named HQL语句
	 * @param extendHql
	 *            扩展的hql语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected List queryNamedHqlListByPage(String hql, String extendHql,
			int start, int limit, Object... params) throws Exception {
		return queryHqlListByPage(getHibernateSession().getNamedQuery(hql)
				.getQueryString()
				+ extendHql, start, limit, params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param <T>
	 * @param hql
	 *            查询实体集合的Named HQL语句
	 * @param extendHql
	 *            扩展的hql语句
	 * @param c
	 *            实体类型
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected <T extends Serializable> List<T> queryNamedHqlEntityListByPage(
			Class<T> c, String hql, String extendHql, int start, int limit,
			Object... params) throws Exception {
		return queryHqlEntityListByPage(c, getHibernateSession().getNamedQuery(hql)
				.getQueryString()
				+ extendHql, start, limit, params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的Named HQL语句
	 * @param extendHql
	 *            扩展的hql语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected List<Map<String, Object>> queryNamedHqlMapListByPage(String hql,
			String extendHql, int start, int limit, Object... params)
			throws Exception {
		return queryHqlMapListByPage(getHibernateSession().getNamedQuery(hql)
				.getQueryString()
				+ extendHql, start, limit, params);
	}

	/**
	 * 执行Named HQL查询的分页数据
	 * 
	 * @param hql
	 *            查询的Named HQL语句
	 * @param extendHql
	 *            扩展的hql语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named HQL语句参数列表
	 * @return Named HQL查询的分页数据
	 * @throws Exception
	 */
	protected List<Object[]> queryNamedHqlObjectListByPage(String hql,
			String extendHql, int start, int limit, Object... params)
			throws Exception {
		return queryHqlObjectListByPage(getHibernateSession().getNamedQuery(hql)
				.getQueryString()
				+ extendHql, start, limit, params);
	}

	// ====================================NamedHql方法======================================================

	// ====================================sql方法======================================================

	/**
	 * 执行原生sql 数据库更新语句
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            sql语句参数列表
	 * @return 数据库影响行数
	 * @throws Exception
	 */
	protected int executeSql(String sql, Object... params) throws Exception {
		SQLQuery query = getHibernateSession().createSQLQuery(sql);
		processParams(query, params);
		int i = query.executeUpdate();
		return i;
	}

	/**
	 * 执行原生sql 数据库查询语句并返回分页结果
	 * 
	 * @param sql
	 *            sql语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            sql语句参数列表
	 * @return 分页查询结果集
	 * @throws Exception
	 */
	protected List querySqlByPage(String sql, int start, int limit,
			Object... params) throws Exception {
		SQLQuery query = getHibernateSession().createSQLQuery(sql);
		query.setFirstResult(start);
		query.setMaxResults(limit);
		processParams(query, params);
		return query.list();
	}

	/**
	 * 执行原生sql 数据库查询语句并返回结果
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            sql语句参数列表
	 * @return 查询结果集
	 * @throws Exception
	 */
	protected List querySql(String sql, Object... params) throws Exception {
		SQLQuery query = getHibernateSession().createSQLQuery(sql);
		processParams(query, params);
		return query.list();
	}

	/**
	 * 执行原生sql 数据库count查询语句并返回结果
	 * 
	 * @param sql
	 *            sql语句
	 * @param params
	 *            sql语句参数列表
	 * @return 查询结果
	 * @throws Exception
	 */
	protected int querySqlCount(String sql, Object... params) throws Exception {
		SQLQuery query = getHibernateSession().createSQLQuery(sql);
		processParams(query, params);
		Number count = (Number) query.uniqueResult();
		return count.intValue();
	}

	/**
	 * 执行Named原生sql 数据库更新语句
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param params
	 *            Named sql语句参数列表
	 * @return 数据库影响行数
	 * @throws Exception
	 */
	protected int executeNamedSql(String sql, Object... params)
			throws Exception {
		return executeSql(
				getHibernateSession().getNamedQuery(sql).getQueryString(), params);
	}

	/**
	 * 执行Named原生sql 数据库查询语句并返回分页结果
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named sql语句参数列表
	 * @return 分页查询结果集
	 * @throws Exception
	 */
	protected List queryNamedSqlByPage(String sql, int start, int limit,
			Object... params) throws Exception {
		return querySqlByPage(getHibernateSession().getNamedQuery(sql)
				.getQueryString(), start, limit, params);
	}

	/**
	 * 执行Named原生sql 数据库查询语句并返回结果
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param params
	 *            Named sql语句参数列表
	 * @return 查询结果集
	 * @throws Exception
	 */
	protected List queryNamedSql(String sql, Object... params) throws Exception {
		return querySql(getHibernateSession().getNamedQuery(sql).getQueryString(),
				params);
	}

	/**
	 * 执行Named原生sql 数据库count查询语句并返回结果
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param params
	 *            Named sql语句参数列表
	 * @return 查询结果
	 * @throws Exception
	 */
	protected int queryNamedSqlCount(String sql, Object... params)
			throws Exception {
		return querySqlCount(getHibernateSession().getNamedQuery(sql)
				.getQueryString(), params);
	}

	/**
	 * 执行Named原生sql 数据库更新语句
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param extendSql
	 *            扩展的sql语句
	 * @param params
	 *            Named sql语句参数列表
	 * @return 数据库影响行数
	 * @throws Exception
	 */
	protected int executeNamedSql(String sql, String extendSql,
			Object... params) throws Exception {
		return executeSql(getHibernateSession().getNamedQuery(sql).getQueryString()
				+ extendSql, params);
	}

	/**
	 * 执行Named原生sql 数据库查询语句并返回分页结果
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param extendSql
	 *            扩展的sql语句
	 * @param start
	 *            查询的开始索引
	 * @param limit
	 *            查询的记录最大数量
	 * @param params
	 *            Named sql语句参数列表
	 * @return 分页查询结果集
	 * @throws Exception
	 */
	protected List queryNamedSqlByPage(String sql, String extendSql, int start,
			int limit, Object... params) throws Exception {
		return querySqlByPage(getHibernateSession().getNamedQuery(sql)
				.getQueryString()
				+ extendSql, start, limit, params);
	}

	/**
	 * 执行Named原生sql 数据库查询语句并返回结果
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param extendSql
	 *            扩展的sql语句
	 * @param params
	 *            Named sql语句参数列表
	 * @return 查询结果集
	 * @throws Exception
	 */
	protected List queryNamedSql(String sql, String extendSql, Object... params)
			throws Exception {
		return querySql(getHibernateSession().getNamedQuery(sql).getQueryString()
				+ extendSql, params);
	}

	/**
	 * 执行Named原生sql 数据库count查询语句并返回结果
	 * 
	 * @param sql
	 *            Named sql语句
	 * @param extendSql
	 *            扩展的sql语句
	 * @param params
	 *            Named sql语句参数列表
	 * @return 查询结果
	 * @throws Exception
	 */
	protected int queryNamedSqlCount(String sql, String extendSql,
			Object... params) throws Exception {
		return querySqlCount(getHibernateSession().getNamedQuery(sql)
				.getQueryString()
				+ extendSql, params);
	}

	// ====================================sql方法======================================================

	// ====================================公共方法======================================================
	/**
	 * 处理查询参数
	 * 
	 * @param query
	 *            要处理参数的查询
	 * @param params
	 *            参数列表
	 */
	private void processParams(Query query, Object... params) {
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				if (params[i].getClass().isArray()) {
					query.setParameterList("p" + i, (Object[]) params[i]);
				} else if (params[i] instanceof Collection<?>) {
					query.setParameterList("p" + i,
							(Collection<?>) params[i]);
				} else {
					query.setParameter("p" + i, params[i]);
				}
			}
		}
	}
	// ====================================公共方法======================================================

}
